package jse.concurrent;

import java.util.concurrent.CyclicBarrier;

/**
 * 一个同步辅助类，在完成一组正在其他线程中执行的操作之前，它允许一个或多个线程一直等待。
 * 用给定的计数 初始化 CountDownLatch。由于调用了 countDown() 方法，所以在当前计数到达0之前，await 方法会一直受阻塞。
 * 之后，会释放所有等待的线程，await 的所有后续调用都将立即返回。这种现象只出现一次——计数无法被重置。如果需要重置计数，请考虑使用 CyclicBarrier。
 * 使用场景：
 * 在一些应用场合中，需要等待某个条件达到要求后才能做后面的事情；同时当线程都完成后也会触发事件，以便进行后面的操作。
 * 这个时候就可以使用CountDownLatch。CountDownLatch最重要的方法是countDown()和await()，前者主要是倒数一次，后者是等待倒数到0，如果没有到达0，就只有阻塞等待了。
 * @ClassName	CyclicBarrierTest
 * @Date		2018年2月9日 下午2:10:24
 * @Author		liangjl
 * @Copyright (c) All Rights Reserved, 2018.
 */
public class CyclicBarrierTest {
	
	
    private static final int THREAD_NUM = 5;
    
    
    public static class WorkerThread implements Runnable{
        CyclicBarrier barrier;
        public WorkerThread(CyclicBarrier b){
            this.barrier = b;
        }
        public void run() {
            try{
                System.out.println("Worker's waiting");
                //线程在这里等待，直到所有线程都到达barrier。
                barrier.await();
                System.out.println("ID:"+Thread.currentThread().getId()+" Working");
            }catch(Exception e){
                e.printStackTrace();
            }
        }
    }
    
    
    
    public static void main(String[] args) {
    	 CyclicBarrier cb = new CyclicBarrier(THREAD_NUM, new Runnable() {
    		//当所有线程到达barrier时执行
			@Override
			public void run() {
                System.out.println("Inside Barrier");
			}
			
    	 });
    	 
    	 for(int i=0;i<THREAD_NUM;i++){
             new Thread(new WorkerThread(cb)).start();
         }
	}
    
    
    

}
 